var assert = require('assert');
var Todo = require('./todo');
var todo = new Todo();

var testsCompleted = 0;

/**
 * 测试以确保删除后没留下待办事项
 */
function deleteTest() { 
  todo.add('Delete Me'); // 添加一些数据 以便测试删除
  assert.equal(todo.getCount(), 1, '1 item should exist'); // 断言 数据被正确添加
  todo.deleteAll(); // 删除所有记录
  assert.equal(todo.getCount(), 0, 'No items should exist'); // 断言记录已被删除
  testsCompleted++; // 记录测试已完成
}

/**
 * 测试以确保待办事项添加能用
 */
function addTest() {
  // 断言之前有事项存在
  todo.deleteAll(); // 删除之前所有的事项
  todo.add('Added'); // 添加事项
  assert.notEqual(todo.getCount(), 0, '1 item should exists');
  testsCompleted++; // 记录测试已完成
}

/**
 * 测试看doAsync回调传入的是否为true
 */
function doAsyncTest(cb) {
  todo.doAsync(function(value) { // 两秒后激活回调
    assert.ok(value, 'Callback should be passed true'); // 断言值为true
    testsCompleted++; // 记录测试已完成
    cb();
  });
}

/**
 * 测试看缺少参数时add是否会抛出错误
 */
function throwsTest(cb) {
  assert.throws(todo.add, /requires/); // 不带参数调用todo.add
  testsCompleted++; // 记录测试已完成
}

/**
 * 运行测试并报告测试完成
 */
deleteTest();
addTest();
throwsTest();
doAsyncTest(function() {
  console.log('Completed ' + testsCompleted + ' tests'); // 表明结束的测试
});
